/* AnalisadorLexico.java
 
  Classe representando uma gramática para analisador sintático.
 
  Última modificação: 27/06/2010
 
  Autores:
     Felipe Lacet
     Gutenberg Neto
     Jader James
     Marcello Galdino
     Ronei Oliveira
 
  A GRAMÁTICA ESTÁ ACEITANDO AS SEGUINTES CLASSIFICAÇÕES:

    CLASSE					ABREVIAÇÃO			EXEMPLO			CONSIDERA

    Adjetivo Singular                   ==	adj.sing.			bonito			num
    Adjetivo Plural			==	adj.pl.				bonitas			num

    Artigo Masculino Singular           ==	art.m.sing.			o			num/gen
    Artigo Feminino Singular            ==	art.f.sing.			a			num/gen
    Artigo Masculino Plural		==	art.m.pl.			os			num/gen
    Artigo Feminino Plural		==	art.f.pl.			as			num/gen

    Conjunção                           ==	conj.				mas

    Preposição                          ==	prep.				de

    Pronome				==	pron.				eu

    Pontuação (!?.;)                    ==	pontuacao
    Pontuação Intermediaria (,)         ==	pontuacao_intermediaria

    Substantivo Masculino Singular	==	s.m.sing.			carro			num/gen
    Substantivo Feminino Singular	==	s.f.sing.			bola			num/gen
    Substantivo Masculino Plural	==	s.m.pl.				carros			num/gen
    Substantivo Feminino Plural         ==	s.f.pl.				geladeiras		num/gen

    Verbo 1ª pessoa singular            ==	verbo1				sou
    Verbo 2ª pessoa singular            ==	verbo2				és
    Verbo 3ª pessoa singular            ==	verbo3				é
    Verbo 1ª pessoa plural		==	verbo4				somos
    Verbo 2ª pessoa plural		==	verbo5				sois
    Verbo 3ª pessoa plural		==	verbo6				são
 
  ps.: Tudo minúsculo e sem espaço!

 */

package sintatico;

import corretorgramatical.Palavra;
import java.util.ArrayList;


public class AnalisadorSintatico {

    private ArrayList<Palavra> tabela;
    private int index = 0;

    public String palavraErrada = "";
    public String logErro = "";

    public AnalisadorSintatico(ArrayList<Palavra> tabela) {
        this.tabela = tabela;

        System.out.println("Sintatico recebendo a Tabela:");
        for (int i = 0; i < tabela.size(); i++) {
           System.out.println(tabela.get(i));
        }

        //Começa a analise do texto
        texto();
    }

    //Posiciona o index no proximo token, se existir
    private void analisaProximoToken() {
        if(index < tabela.size()-1){
            index++;
        }
    }

    //Pega o tipo do token da tabela
    private String pegaTipoDaTabela() {
        return tabela.get(index).tipo;
    }

    //Pega o tipo do token da tabela
    private String pegaTokenDaTabela() {
        return tabela.get(index).token;
    }

    public void setPalavraErrada(String palavraErrada) {
        this.palavraErrada = palavraErrada;
    }

    public void setLogErro(String logErro) {
        this.logErro = logErro;
    }
    
    public String getPalavraErrada(){
        return palavraErrada;
    }

    public String getLogErro() {
        return logErro;
    }

/* ############################################################################
 * #####################ANALISADOR SINTÁTICO###################################
 * ############################################################################
 */
    /*
     <texto> :: <paragrafos>
     */
    private void texto(){
        paragrafos();
        return;
    }


    /*
     <paragrafos> :: <paragrafo><paragrafos>
                    | Ɛ
     */
    private void paragrafos() {
        if(pegaTipoDaTabela().contains("s.")|
           pegaTipoDaTabela().contains("art.")|
           pegaTipoDaTabela().contains("verbo"))
        {
            paragrafo();
            paragrafos();
            return;
        }else{
            return;
        }
    }


    /*
     <paragrafo> :: <frase><conexao_pontuacao><paragrafo>
     */
    private void paragrafo() {
        if(pegaTipoDaTabela().contains("s.")|
           pegaTipoDaTabela().contains("art.")|
           pegaTipoDaTabela().contains("verbo"))
        {            
            frase();
            conexaoOuPontuacao();
            paragrafo();
            return;
        }
        else
        {
            return;
        }
    }


    /*
     <conexao_pontuacao> :: pontuacao| conjuncao | Ɛ
     */
    private void conexaoOuPontuacao() {
        if(pegaTipoDaTabela().contains("pontuacao"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("conj."))
        {
            analisaProximoToken();
            return;
        }
        else{
            analisaProximoToken();
            return;
        }
    }


    /*
     <frase> :: <sujeito_simples_sing><verbo_sing><objeto>
               | <sujeito_simples_plur><verbo_plur><objeto>
               | <verbo_sing><sujeito_simples_sing>
               | <verbo_plur><sujeito_simples_plur>
               | Ɛ
     */
    private void frase() {
        if(pegaTipoDaTabela().contains("s.m.sing.")|
           pegaTipoDaTabela().contains("s.f.sing.")|
           pegaTipoDaTabela().contains("art.m.sing.")|
           pegaTipoDaTabela().contains("art.f.sing."))
        {
            sujeitoSimplesSingular();
            verboSingular();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("s.m.pl.")|
           pegaTipoDaTabela().contains("s.f.pl.")|
           pegaTipoDaTabela().contains("art.m.pl.")|
           pegaTipoDaTabela().contains("art.f.pl."))
        {
            sujeitoSimplesPlural();
            verboPlural();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo1")|
                pegaTipoDaTabela().contains("verbo2")|
                pegaTipoDaTabela().contains("verbo3"))
        {
            verboSingular();
            sujeitoSimplesSingular();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo4")|
                pegaTipoDaTabela().contains("verbo5")|
                pegaTipoDaTabela().contains("verbo6"))
        {
            verboPlural();
            sujeitoSimplesPlural();
            return;
        }
        else{
            return;
        }
    }


    /*     
     <sujeito_simples_sing>:: subst_masc_sing
                             | subst_fem_sing
                             | pronome
                             | artigo_masc_sing <adjetivo_sing>  substantivo_masc_sing <adjetivo_sing>
                             | artigo_fem_sing <adjetivo_sing>  substantivo_fem_sing <adjetivo_sing>
                             | Ɛ
     */
    private void sujeitoSimplesSingular() {
        if(pegaTipoDaTabela().contains("s.m.sing."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("s.m.pl."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
            return;
        }
        else if(pegaTipoDaTabela().contains("s.f.sing."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("s.f.pl."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
            return;
        }
        else if(pegaTipoDaTabela().contains("pron."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.m.sing."))
        {
            analisaProximoToken();
            adjetivoSingular();
            
            if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"o");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"o");
                return;
            }

            adjetivoSingular();
            auxiliarSujeito();
            return;
        }

        else if(pegaTipoDaTabela().contains("art.f.sing."))
        {
            analisaProximoToken();
            adjetivoSingular();

            if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                analisaProximoToken();                
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"a");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"a");
                return;
            }

            adjetivoSingular();
            auxiliarSujeito();
            return;
        }
        else{
            return;
        }
    }


    /*
     <sujeito_simples_plur>:: subst_masc_plur
                             | subst_fem_plur
                             | pronome
                             | artigo_masc_plur <adjetivo_plur> substantivo_masc_plur <adjetivo_plur> <auxiliar_sujeito>
                             | artigo_fem_plur <adjetivo_plur> substantivo_fem_plur <adjetivo_plur> <auxiliar_sujeito>
                             | Ɛ
     */
    private void sujeitoSimplesPlural() {

        if(pegaTipoDaTabela().contains("s.m.pl."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("s.m.sing."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
            return;
        }
        else if(pegaTipoDaTabela().contains("s.f.pl."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("s.f.sing."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
            return;
        }
        else if(pegaTipoDaTabela().contains("pron."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.m.pl."))
        {
            analisaProximoToken();
            adjetivoPlural();

            if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"os");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"os");
                return;
            }

            adjetivoPlural();
            auxiliarSujeito();
            return;
        }

        else if(pegaTipoDaTabela().contains("art.f.pl."))
        {
            analisaProximoToken();
            adjetivoPlural();

            if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"as");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"as");
                return;
            }

            adjetivoPlural();
            auxiliarSujeito();
            return;
        }
        else{
            return;
        }
    }


    /*
    <auxiliar_sujeito> :: preposicao substantivo <auxiliar_sujeito_2>
                         | Ɛ
     */
    private void auxiliarSujeito(){
        if(pegaTipoDaTabela().contains("prep.")){
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("s.")){
                analisaProximoToken();
            }else{
                return;
            }

            auxiliarSujeito2();
        }
        else{
            return;
        }
    }


    /*
    <auxiliar_sujeito_2> :: , preposicao substantivo <auxiliar_sujeito_2>
                           | conjuncao substantivo
                           | Ɛ
    */
     private void auxiliarSujeito2(){
        if(pegaTipoDaTabela().contains("pontuacao_intermediaria")){
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("prep.")){
                analisaProximoToken();

                if(pegaTipoDaTabela().contains("s.")){
                    analisaProximoToken();
                }
            }else{
                return;
            }

            auxiliarSujeito2();
        }
        else if(pegaTipoDaTabela().contains("conj.")){
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("s.")){
                analisaProximoToken();
            }else{
                return;
            }
        }
        else{
            return;
        }
    }


     /*
     <verbo_sing> :: verbo_1ª_pessoa_sing
                    | verbo_2ª_pessoa_sing
                    | verbo_3ª_pessoa_sing
                    | Ɛ
     */
    private void verboSingular() {
        
        if(pegaTipoDaTabela().contains("verbo1"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo2"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo3"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo4")|
                pegaTipoDaTabela().contains("verbo5")|
                pegaTipoDaTabela().contains("verbo6"))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Você digitou o verbo "+pegaTokenDaTabela()+" e ele está no plural, mude o verbo para o singular.");
            return;
        }
        else
        {
            return;
        }
    }


    /*
     <verbo_plur> :: verbo_1ª_pessoa_plur
                    | verbo_2ª_pessoa_plur
                    | verbo_3ª_pessoa_plur
                    | Ɛ
     */
    private void verboPlural() {
        if(pegaTipoDaTabela().contains("verbo4"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo5"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo6"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo1")|
                pegaTipoDaTabela().contains("verbo2")|
                pegaTipoDaTabela().contains("verbo3"))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Você digitou o verbo "+pegaTokenDaTabela()+" e ele está no singular, mude o verbo para o plural.");
            return;
        }
        else
        {
            return;
        }
    }


    /*
     <adjetivo_sing> :: adjetivo_sing <adjetivo_sing_2> | Ɛ
     */
    private void adjetivoSingular() {
        if(pegaTipoDaTabela().contains("adj.sing.")){
            analisaProximoToken();
            adjetivoSingular2();            
        }
        else if(pegaTipoDaTabela().contains("adj.pl.")){
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
            return;
        }
        else{
            return;
        }
    }


    /*
     <adjetivo_sing_2> :: adjetivo_sing <adjetivo_sing_2>
                         |, adjetivo_sing <adjetivo_sing_2>
                         |conjuncao adjetivo_sing <adjetivo_sing_2>
                         | Ɛ
     */
    private void adjetivoSingular2() {
        if(pegaTipoDaTabela().contains("adj.sing."))
        {
            analisaProximoToken();
            adjetivoSingular2();
        }
        else if(pegaTipoDaTabela().contains("adj.pl."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
            return;
        }
        else if(pegaTipoDaTabela().contains("pontuacao_intermediaria"))
        {
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("adj.sing."))
            {
                analisaProximoToken();
                adjetivoSingular2();
            }
            else if(pegaTipoDaTabela().contains("adj.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else
            {
                return;
            }
        }
        else if(pegaTipoDaTabela().contains("conj."))
        {
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("adj.sing."))
            {
                analisaProximoToken();
                adjetivoSingular2();
                return;
            }
            else if(pegaTipoDaTabela().contains("adj.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else
            {
                return;
            }
        }
        else
        {
            return;
        }
    }


    /*
     <adjetivo_plur> :: adjetivo_plur <adjetivo_plur_2> | Ɛ
     */
    private void adjetivoPlural() {
        if(pegaTipoDaTabela().contains("adj.pl.")){
            analisaProximoToken();
            adjetivoPlural2();
        }
        else if(pegaTipoDaTabela().contains("adj.sing.")){
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
            return;
        }
        else{
            return;
        }
    }


    /*
     <adjetivo_plur_2> :: adjetivo_plur <adjetivo_plur_2>
                         |, adjetivo_plur <adjetivo_plur_2>
                         |conjuncao adjetivo_plur <adjetivo_plur_2>
                         | Ɛ
     */
    private void adjetivoPlural2() {
        if(pegaTipoDaTabela().contains("adj.pl."))
        {
            analisaProximoToken();
            adjetivoPlural2();
        }
        else if(pegaTipoDaTabela().contains("adj.sing."))
        {
            setPalavraErrada(pegaTokenDaTabela());
            setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
            return;
        }
        else if(pegaTipoDaTabela().contains("pontuacao_intermediaria"))
        {
            analisaProximoToken();
            
            if(pegaTipoDaTabela().contains("adj.pl."))
            {
                analisaProximoToken();
                adjetivoPlural2();                
            }
            else if(pegaTipoDaTabela().contains("adj.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else
            {
                return;
            }
        }
        else if(pegaTipoDaTabela().contains("conj."))
        {
            analisaProximoToken();

            if(pegaTipoDaTabela().contains("adj.pl."))
            {
                analisaProximoToken();
                adjetivoPlural2();
            }
            else if(pegaTipoDaTabela().contains("adj.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else
            {
                return;
            }
        }
        else
        {
            return;
        }
    }


    /*
     <objeto > :: substantivo_masc_sing
                  | substantivo_fem_sing
                  | substantivo_masc_plur
                  | substantivo_fem_plur
                  | artigo_masc_sing <adjetivo_sing>  substantivo_masc_sing <adjetivo_sing> <objeto>
                  | artigo_fem_sing <adjetivo_sing>  substantivo_fem_sing <adjetivo_sing> <objeto>
                  | artigo_masc_plur <adjetivo_plur> substantivo_masc_plur <adjetivo_plur> <objeto>
                  | artigo_fem_plur <adjetivo_plur> substantivo_fem_plur <adjetivo_plur> <objeto>
                  | artigo_fem_plur <adjetivo_plur> substantivo_fem_plur <adjetivo_plur> <objeto>
                  | preposicao substantivo <objeto>
                  | conjuncao substantivo <objeto>
	          | Ɛ

     */
    private void objeto() {
        if(pegaTipoDaTabela().contains("s."))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("verbo"))
        {
            analisaProximoToken();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.m.sing."))
        {
            analisaProximoToken();
            adjetivoSingular();

            if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"o");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"o");
                return;
            }

            adjetivoSingular();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.f.sing."))
        {
            analisaProximoToken();
            adjetivoSingular();

            if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1));
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"a");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"a");
                return;
            }

            adjetivoSingular();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.m.pl."))
        {
            analisaProximoToken();
            adjetivoPlural();

            if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"os");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"os");
                return;
            }

            adjetivoPlural();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("art.f.pl."))
        {
            analisaProximoToken();
            adjetivoPlural();

            if(pegaTipoDaTabela().contains("s.f.pl."))
            {
                analisaProximoToken();
            }
            else if(pegaTipoDaTabela().contains("s.f.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela()+"s");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.sing."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero e de número: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-1)+"as");
                return;
            }
            else if(pegaTipoDaTabela().contains("s.m.pl."))
            {
                setPalavraErrada(pegaTokenDaTabela());
                setLogErro("Ocorreu um erro de gênero: substitua "+pegaTokenDaTabela()+" por "+pegaTokenDaTabela().subSequence(0, pegaTokenDaTabela().length()-2)+"as");
                return;
            }
            
            adjetivoPlural();
            objeto();
            return;
        }
        else if(pegaTipoDaTabela().contains("prep.")){
            analisaProximoToken();
            
            if(pegaTipoDaTabela().contains("s.")){
                analisaProximoToken();
            }else{
                return;
            }
            objeto();
        }
        else if(pegaTipoDaTabela().contains("conj.")){
            analisaProximoToken();
            
            if(pegaTipoDaTabela().contains("s.")){
                analisaProximoToken();
            }else{
                return;
            }
            objeto();
        }
        else{
            return;
        }
    }


}
